package com.msk.sys.utils;


import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.*;
import java.util.Map;

/* *
 * @Author pzk
 * @Description 根据Doc模板生成文件
 * @Date 20:59 2019/8/31
 * @Param
 * @return
 **/
public class DocUtils {
    private static Log log = LogFactory.getLog(DocUtils.class);
    public Configuration configure=null;

    public DocUtils(){
        configure=new Configuration();
        configure.setDefaultEncoding("utf-8");
        configure.setDateFormat("yyyy-MM-dd");
        configure.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 根据Doc模板生成word文件
     * @param dataMap 需要填入模板的数据
     * @param downloadType 文件名称
     * @param savePath 保存路径
     */
    public boolean createDocBak(Map<String,Object> dataMap, String downloadType, String savePath){
        log.error("createDoc.downloadType="+downloadType);
        Writer out=null;
        FileOutputStream in = null;
        OutputStreamWriter output=null;
        try {
            //判断并生成文件目录
            String templateSavePath = "/var/tmp/freemarkerfile";
            File templateDir = new File(templateSavePath);
            if(!templateDir.exists()){
                templateDir.mkdirs();
            }
            File templateSaveDir = new File(templateSavePath);
            if(!templateSaveDir.exists()){
                templateSaveDir.mkdirs();
            }
            //加载需要装填的模板
            Template template=null;
            //设置模板装置方法和路径，FreeMarker支持多种模板装载方法。可以重servlet，classpath,数据库装载。
            //加载模板文件，放在testDoc下
            // configure.setClassForTemplateLoading(this.getClass(), "/com/template");
            configure.setDirectoryForTemplateLoading(templateDir);
            //设置对象包装器
//            configure.setObjectWrapper(new DefaultObjectWrapper());
            //设置异常处理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            //定义Template对象，注意模板类型名字与downloadType要一致
            template=configure.getTemplate(downloadType+".ftl");
            File outFile=new File(savePath);
            in = new FileOutputStream(outFile);
            output= new OutputStreamWriter(in, "utf-8");
            out=new BufferedWriter(output);
            template.process(dataMap, out);
            out.flush();
        } catch (IOException e) {
            log.error("error:"+e.getMessage());
            return false;
        } catch (TemplateException e) {
            log.error("error:"+e.getMessage());
            return false;
        }finally {
            if (in != null){
                try{
                    in.close();
                }
                catch (Exception ex){
                    log.error("error:"+ex.getMessage());
                }
            }
            if (output != null){
                try{
                    output.close();
                }
                catch (Exception ex){
                    log.error("error:"+ex.getMessage());
                }
            }
            if (out != null){
                try{
                    out.close();
                }
                catch (Exception ex){
                    log.error("error:"+ex.getMessage());
                }
            }
        }
        return true;
    }


    /**
     * 根据Doc模板生成word文件
     * @param dataMap 需要填入模板的数据
     * @param downloadType 文件名称
     * @param savePath 保存路径
     */
    public boolean createDocNew(Map<String,Object> dataMap, String downloadType, String savePath){
        log.error("createDoc.downloadType="+downloadType);
        Writer out=null;
        FileOutputStream in = null;
        OutputStreamWriter output=null;
        try {
            //判断并生成文件目录
            String templateSavePath = "/var/tmp/freemarkerfile";
            File templateSaveDir = new File(templateSavePath);
            if(!templateSaveDir.exists()){
                templateSaveDir.mkdirs();
            }
            //加载需要装填的模板
            Template template=null;
            //设置模板装置方法和路径，FreeMarker支持多种模板装载方法。可以重servlet，classpath,数据库装载。
            //加载模板文件，放在testDoc下
            configure.setClassForTemplateLoading(this.getClass(), "/templates");
            //设置对象包装器
//            configure.setObjectWrapper(new DefaultObjectWrapper());
            //设置异常处理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            //定义Template对象，注意模板类型名字与downloadType要一致
            template=configure.getTemplate(downloadType+".ftl");
            File outFile=new File(savePath);
            in = new FileOutputStream(outFile);
            output= new OutputStreamWriter(in, "utf-8");
            out=new BufferedWriter(output);
            template.process(dataMap, out);
            out.flush();
        } catch (IOException e) {
            log.error("error:"+e.getMessage());
            return false;
        } catch (TemplateException e) {
            log.error("error:"+e.getMessage());
            return false;
        }finally {
            if (in != null){
                try{
                    in.close();
                }
                catch (Exception ex){
                    log.error("error:"+ex.getMessage());
                }
            }
            if (output != null){
                try{
                    output.close();
                }
                catch (Exception ex){
                    log.error("error:"+ex.getMessage());
                }
            }
            if (out != null){
                try{
                    out.close();
                }
                catch (Exception ex){
                    log.error("error:"+ex.getMessage());
                }
            }
        }
        return true;
    }

}
